print("Hello World")

# python变量命名使用小写下划线或者驼峰命名法
# 变量和函数名 应该使用小写字母加下划线
user_name = "张三"
print("user_name: ", user_name)

# 四大基本数据类型
# 整数（int）、浮点数（float）、字符串（str）、布尔（bool）
# 整数对应java的byte、short、int、long
# 浮点数对应java的float、double
# 字符串对应java的char、String
# 布尔对应java的boolean

# 1. 整数
x = 123
print("x = ", x)
print("x的类型", type(x))

# 2. 浮点数
y = 123.78
print("y = ", y)
print("y的类型", type(y))

# 和java类似，浮点数无法精确表示
a = 0.1
b = 0.2
print(f"a = {a}, b = {b}, a + b = {a + b}")

# 想要精确表示浮点数，需要使用Decimal类
from decimal import Decimal

# 和java类似，需要转换为字符串
print("精确计算小数", Decimal(str(a)) + Decimal(str(b)))

# 3. 布尔是True和False，和java不一样。java是true和false，小写的
z = True
print("z = ", z)
print("z的类型", type(z))

# 4. 字符串。python中没有字符型，只有字符串
# 字符串用单引号或者双引号
s1 = "Hello World"
print("s1 = ", s1)
print("s1的类型", type(s1))
s2 = 'Hello World'
print("s2 =", s2)

print("*" * 20)
# 字符串可以换行
s3 = """\
2024
Hello World
你好世界\
"""
print(s3)

print("*" * 20)
s4 = '''\
Hello World
你好世界\
'''
print(s4)

# python中使用None表示空值，类似java的null
test_a = None
print("test_a = ", test_a)
print("test_a的类型", type(test_a))
# 如果想要进行判空，可以使用is not None或者is None

if test_a is None:
    print("test_a is None")

test_b = "张三"
if test_b is not None:
    print("test_b is not None")

# 3.5版本之后，python支持type hints
# 类似scala，可以明确变量的数据类型，但是不支持类型检查
test_int: int = 123
# 如果重新赋值，类型检查在ide中会报错，运行时不会报错
# Mypy: Incompatible types in assignment (expression has type "str", variable has type "int") [assignment]
# test_int = "123"
print("test_int", test_int)

# 常见的内置函数
# 转换成整数
print("int(123) =", int("123"))  # 123 将字符串转换成为整数
print("int(123.78)", int(123.78))  # 123 将浮点数转换成为整数
print("int(True)", int(True))  # 1 布尔值True转换成为整数是 1
print("int(False)", int(False))  # 0 布尔值False转换成为整数是 0

# 转换成浮点数
f1 = float("12.34")
print("float(\"12.34\")", f1)  # 12.34

# type方法，可以获取变量的类型
print(type(f1))  # float 将字符串的 "12.34" 转换成为浮点数 12.34

f2 = 23.0

# isinstance方法，可以判断变量的类型
print(isinstance(f2, int))

# id方法，可以获取变量的内存地址
print(id(f2))
